package util;

import java.io.Serializable;
import java.util.List;

public interface IGenericDAO {

	/**
	 * Sucht Instanzen einer Klasse, welche den angegebenen Attributen
	 * &auml;hnlich sind (sql like) oder größer/gleich/kleiner (sql > >= < <=)
	 * sind.<br>
	 * <br>
	 * 
	 * <strong>Beispiele fuer ein attributValue:</strong> <BLOCKQUOTE><br>
	 * <strong>_</strong> steht für ein beliebiges Zeichen an dieser stelle.<br>
	 * <strong>%</strong> steht für eine beliebige Zeichenkette an dieser
	 * stelle.<br>
	 * <strong>A_Z:</strong> entspricht ABZ, A1Z, ...<br>
	 * <strong>%BC:</strong> entspricht ABC, A1BC, ...<br>
	 * <strong>>12:</strong> entspricht 13, 14, ...<br>
	 * <strong>>12:</strong> entspricht 13, 14, ...<br>
	 * </BLOCKQUOTE>
	 * 
	 * @param entityClass
	 *            Die Klasse von der man Instanzen sucht.
	 * @param attributeNames
	 *            Die Namen der Attribute.
	 * @param attributeValues
	 *            Die Werte der Attribute.
	 */
	@SuppressWarnings("unchecked")
	public <TEntity> List<TEntity> findByWhereAttributes(
			Class<TEntity> entityClass, String[] attributeNames,
			String[] attributeValues) throws RuntimeException;

	/**
	 * Sucht Instanzen einer Klasse, welche den angegebenen Attributen
	 * &auml;hnlich sind (sql like) oder größer/gleich/kleiner (sql > >= < <=)
	 * sind.<br>
	 * <br>
	 * 
	 * <strong>Beispiele fuer ein attributValue:</strong> <BLOCKQUOTE><br>
	 * <strong>_</strong> steht für ein beliebiges Zeichen an dieser stelle.<br>
	 * <strong>%</strong> steht für eine beliebige Zeichenkette an dieser
	 * stelle.<br>
	 * <strong>A_Z:</strong> entspricht ABZ, A1Z, ...<br>
	 * <strong>%BC:</strong> entspricht ABC, A1BC, ...<br>
	 * <strong>>12:</strong> entspricht 13, 14, ...<br>
	 * <strong>>12:</strong> entspricht 13, 14, ...<br>
	 * </BLOCKQUOTE>
	 * 
	 * @param entityClass
	 *            Die Klasse von der man Instanzen sucht.
	 * @param attributeNames
	 *            Die Namen der Attribute.
	 * @param attributeValues
	 *            Die Werte der Attribute.
	 * @param orderByProperty
	 *            Nach welcher spalte sortiert werden soll.
	 * @param sortDirectionAsc
	 *            In welcher Richtung sortiert werden soll.
	 */
	@SuppressWarnings("unchecked")
	public <TEntity> List<TEntity> findByWhereAttributes(
			Class<TEntity> entityClass, String[] attributeNames,
			String[] attributeValues, String orderByProperty,
			boolean sortDirectionAsc) throws RuntimeException;

	/**
	 * L&auml;dt eine Instanz einer Klasse durch Angabe des Prim&auml;ren
	 * Schl&uuml;ssels.
	 * 
	 * @param entityClass
	 *            Die Klasse die zu laden ist.
	 * @param key
	 *            Der prim&auml;re SChl&uuml;ssel der gesuchten Instanz.
	 * @return Die Instanz oder null, wenn keine gefunden wurde.
	 */
	@SuppressWarnings("unchecked")
	public <TEntity, TKey extends Serializable> TEntity getByKey(
			Class<TEntity> entityClass, TKey key) throws RuntimeException;

	/**
	 * Liefert die Gesamtanzahl gefundener Instanzen der spezifizierten Klasse.
	 * Per attributerNames und attributValues k&ouml;nnen Einschr&auml;nkungen
	 * f&uuml;r die Instanzen angegeben werden. (siehe findByWhereAttributes())
	 * <br>
	 * <br>
	 * 
	 * <strong>Beispiele fuer ein attributValue:</strong> <BLOCKQUOTE><br>
	 * <strong>_</strong> steht für ein beliebiges Zeichen an dieser stelle.<br>
	 * <strong>%</strong> steht für eine beliebige Zeichenkette an dieser
	 * stelle.<br>
	 * <strong>A_Z:</strong> entspricht ABZ, A1Z, ...<br>
	 * <strong>%BC:</strong> entspricht ABC, A1BC, ...<br>
	 * <strong>>12:</strong> entspricht 13, 14, ...<br>
	 * <strong>>12:</strong> entspricht 13, 14, ...<br>
	 * </BLOCKQUOTE>
	 * 
	 * 
	 * @param entityClass
	 *            Die Klasse die man untersucht.
	 * @param attributeNames
	 *            Die Attributnamen.
	 * @param attributeValues
	 *            Die Werte der Attribute.
	 * @return Die Gesamtanzahl der gefundenen Instanzen.
	 */
	public <TEntity> int getCountWhereAttributes(Class<TEntity> entityClass,
			String[] attributeNames, String[] attributeValues);

	/**
	 * Kopiert den Status des gegebenen Objektes in das persistente Objekt mit
	 * der ID. Sollte die Instanz noch nicht gespeichert sein, wird sie
	 * gespeichert.
	 * 
	 * @param detachedEntity
	 *            Die Instanz die gespeichert werden soll.
	 * @return Dieaktualisierte persistente Instanz
	 */
	@SuppressWarnings("unchecked")
	public <TEntity> TEntity makePersistent(TEntity detachedEntity)
			throws RuntimeException;

	/**
	 * Entfernt eine Instanz aus der Datenbank.
	 * 
	 * @param entity
	 *            Die Instanz die gel&ouml;scht werden soll.
	 */
	public void makeTransient(Object entity);
	
	public void setMaxResults(int max);
	
	public int getMaxResults();
	
	public void setOffset(int offset);
	
	public int getOffset();
	
}